﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media;

namespace RS.Echarts.Models
{
    /// <summary>
    /// 提示框组件，用于在图表中显示鼠标悬停等交互操作时的提示信息。
    /// </summary>
    public class Tooltip
    {
        /// <summary>
        /// 是否显示提示框组件，包括提示框浮层和axisPointer。
        /// </summary>
        public bool Show { get; set; }

        /// <summary>
        /// 触发类型，可选'item'（数据项图形触发，主要在散点图、折线图等无类目轴的图表中使用）、'axis'（坐标轴触发，主要在柱状图、折线图等有类目轴的图表中使用）、'none'（不触发）。
        /// </summary>
        public string? Trigger { get; set; }

        /// <summary>
        /// 坐标轴指示器配置项，用于控制提示框显示时的指示器样式。
        /// </summary>
        public AxisPointer? AxisPointer { get; set; }

        /// <summary>
        /// 是否显示提示框浮层，默认显示。只需tooltip触发事件或显示axisPointer而不需要显示内容时可配置该项为false。
        /// </summary>
        public bool ShowContent { get; set; }

        /// <summary>
        /// 是否永远显示提示框内容，默认情况下在移出可触发提示框区域后一定时间后隐藏，设置为true可以保证一直显示提示框内容。
        /// </summary>
        public bool AlwaysShowContent { get; set; }

        /// <summary>
        /// 提示框触发的条件，可选'mousemove'（鼠标移动时触发）、'click'（鼠标点击时触发）、'mousemove|click'（同时鼠标移动和点击时触发）、'none'（不在'mousemove'或'click'时触发，用户可以通过action.tooltip.showTip和action.tooltip.hideTip来手动触发和隐藏，也可以通过axisPointer.handle来触发或隐藏）。
        /// </summary>
        public string? TriggerOn { get; set; }

        /// <summary>
        /// 浮层显示的延迟，单位为ms，默认没有延迟，在triggerOn为'mousemove'时有效。
        /// </summary>
        public int ShowDelay { get; set; }

        /// <summary>
        /// 浮层隐藏的延迟，单位为ms，在alwaysShowContent为true的时候无效。
        /// </summary>
        public int HideDelay { get; set; }

        /// <summary>
        /// 鼠标是否可进入提示框浮层中，默认为false，如需详情内交互，如添加链接、按钮，可设置为true。
        /// </summary>
        public bool Enterable { get; set; }

        /// <summary>
        /// 浮层的渲染模式，默认以'html'（即额外的DOM节点展示tooltip）；此外还可以设置为'richText'表示以富文本的形式渲染，渲染的结果在图表对应的Canvas中，这对于一些没有DOM的环境（如微信小程序）有更好的支持。
        /// </summary>
        public string? RenderMode { get; set; }

        /// <summary>
        /// 是否将tooltip框限制在图表的区域内。当图表外层的dom被设置为'overflow: hidden'，或者移动端窄屏，导致tooltip超出外界被截断时，此配置比较有用。
        /// </summary>
        public bool Confine { get; set; }

        /// <summary>
        /// 从v4.7.0开始支持（自v5.5.0已废弃，请使用AppendTo）。是否将tooltip的DOM节点添加为HTML的<body>的子节点。只有当renderMode为'html'时有意义。默认值是false。false表示，tooltip的DOM节点会被添加为本图表的DOM container的一个子孙节点。但是这种方式导致，如果本图表的DOM container的祖先节点有设置'overflow: hidden'，那么当tooltip超出container范围时可能被截断。这个问题一定程度上可以用tooltip.confine来解决，但是不一定能解决所有场景。所以这里提供了appendToBody: true来解决此事。这也是常见的解决此类问题的一种方式。但是true并不定为默认值，因为要避免break change，尤其是一些对于tooltip深入定制的使用，并且也避免一些未知的bad case。注：CSS transform的场景，这也可以使用。
        /// </summary>
        public bool? AppendToBody { get; set; }

        /// <summary>
        /// 从v5.5.0开始支持。将tooltip的DOM节点添加到哪个节点下。只有当renderMode为'html'时有意义。默认值是null，表示tooltip的DOM节点会被添加为本图表的DOM container的一个子孙节点。但是这种方式导致，如果本图表的DOM container的祖先节点有设置'overflow: hidden'，那么当tooltip超出container范围时可能被截断。这个问题一定程度上可以用tooltip.confine来解决，但是不一定能解决所有场景。对于这样的场景，可以指定appendTo。当其为Function形式时，接口形如(chartContainer: HTMLElement) => HTMLElement | undefined | null，即返回tooltip的DOM节点应该添加到哪个节点下。返回undefined或null表示采用上述的默认逻辑。返回HTMLElement表示添加到该节点下。注：CSS transform的场景，这也可以使用。
        /// </summary>
        public object? AppendTo { get; set; }

        /// <summary>
        /// 从v5.0.0开始支持。指定tooltip的DOM节点的CSS类。（只在html模式下生效）。
        /// </summary>
        public string? ClassName { get; set; }

        /// <summary>
        /// 提示框浮层的移动动画过渡时间，单位是s，设置为0的时候会紧跟着鼠标移动。
        /// </summary>
        public double TransitionDuration { get; set; }

        /// <summary>
        /// 提示框浮层的位置，默认不设置时位置会跟随鼠标的位置。可以是具体坐标值（如'[10, 20]'）、预设位置（如'top'、'bottom'、'left'、'right'、'inside'等）或通过回调函数自定义位置。
        /// </summary>
        public object? Position { get; set; }

        /// <summary>
        /// 提示框浮层内容格式器，支持字符串模板和回调函数两种形式。用于自定义提示框显示的文本内容。
        /// </summary>
        public string? Formatter { get; set; }

        /// <summary>
        /// 从v5.3.0开始支持。tooltip中数值显示部分的格式化回调函数。
        /// </summary>
        public string? ValueFormatter { get; set; }

        /// <summary>
        /// 提示框浮层的背景颜色。
        /// </summary>
        public string? BackgroundColor { get; set; }

        /// <summary>
        /// 提示框浮层的边框颜色。
        /// </summary>
        public string? BorderColor { get; set; }

        /// <summary>
        /// 提示框浮层的边框宽度。
        /// </summary>
        public int BorderWidth { get; set; }

        /// <summary>
        /// 提示框浮层内边距，单位px，默认各方向内边距为5，接受数组分别设定上右下左边距。
        /// </summary>
        public int[]? Padding { get; set; }

        /// <summary>
        /// 提示框浮层的文本样式配置。
        /// </summary>
        public TextStyle? TextStyle { get; set; }

        /// <summary>
        /// 额外的CSS样式，可用于自定义提示框的样式。
        /// </summary>
        public string? ExtraCssText { get; set; }

        /// <summary>
        /// 从v5.0.0开始支持。多系列提示框浮层排列顺序。默认值为'seriesAsc'。提示框排列顺序可选值:'seriesAsc'（根据系列声明，升序排列）、'seriesDesc'（根据系列声明，降序排列）、'valueAsc'（根据数据值，升序排列）、'valueDesc'（根据数据值，降序排列）。
        /// </summary>
        public string? Order { get; set; }
    }

}
